//////////////////////////////////////////////////////////////////////
//
// NO_IOABase.cpp interface for the NO_IOABase class.
//
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
#define NO_TAL_EXPORT

//////////////////////////////////////////////////////////////////////////
#include "NO_Externs.h"
#include "NO_IOABase.h"

//////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
NO_IOABase::NO_IOABase(void):flags(0){}
NO_IOABase::~NO_IOABase(){}

//////////////////////////////////////////////////////////////////////
NO_IOABase::NO_IOABase(const NO_IOABase& rhs)
{
	stream.str(rhs.stream.str());
	flags = rhs.flags;
}

//////////////////////////////////////////////////////////////////////////
NO_IOABase& NO_IOABase::operator= (const NO_IOABase& rhs)
{
	stream.str(rhs.stream.str());
	flags = rhs.flags;
	return *this;
}

//////////////////////////////////////////////////////////////////////////
// modify
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
void NO_IOABase::reset	(void)
{
	if(!stream){return;}
	stream.seekg(0);
	stream.seekp(0);
	serials.clear();
}

//////////////////////////////////////////////////////////////////////
void NO_IOABase::print(void) 
{
	
	if(!stream){return;}
	NO_UInt32 posg = stream.tellg();
	NO_UInt32 posp = stream.tellp();
	stream.seekg(0);
	stream.seekp(0);
	std::cout<<stream.rdbuf()<<std::endl;
	stream.seekg(posg);
	stream.seekp(posp);
}

/************************************************************************/
/* register object always with beginOfObject!!!!                        */
/************************************************************************/	
//////////////////////////////////////////////////////////////////////////
NO_Object& NO_IOABase::registerObject(NO_Object& object,NO_UInt32 id)
{
	if(doNotRegister){return object;}

	SerialMap::iterator iter = serials.find(id);
	SerialMap::iterator end = serials.end();
	if (iter!=end){return object;}
	
	serials[id] = object;
	return object;
}

//////////////////////////////////////////////////////////////////////////
NO_Object& NO_IOABase::findObject(NO_UInt32 id)
{
	if(doNotRegister||doNotFind){return NO_Object::empty;}
	
	SerialMap::iterator iter = serials.find(id);
	SerialMap::iterator end = serials.end();
	if (iter!=end){return iter->second;}
	return NO_Object::empty;
}
